文档章节

python: 一些关于元组的碎碎念

Oh_really
 Oh_really
发布于 09/23 23:53
字数 1144
阅读 34
收藏 0

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))

if __name__=="__main__":
    tuple1 = (1)#坑爹的初始化,这个写法初始化出来是个int!!!
    checkContentAndType(tuple1)

    tuple1 = (1,)#
    checkContentAndType(tuple1)

    list1 = [1]
    checkContentAndType(list1)

    set1 = {1}
    checkContentAndType(set1)

    dict1 = {1: 1}
    checkContentAndType(dict1)

运行结果是:

1
<class 'int'>
(1,)
<class 'tuple'>
[1]
<class 'list'>
{1}
<class 'set'>
{1: 1}
<class 'dict'>

Process finished with exit code 0

第一个初始化出来的居然是个int!,真坑,所以元组里面至少要有一个逗号这个奇怪的经验就出现了

然而,初始化时候还有什么骚操作呢?看这个:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))

if __name__=="__main__":
   tupleTest=1,2,3,'4',5
   checkContentAndType(tupleTest)

他得到的居然还是一个元组!!!没有括号也可以成为元组啊!(嗯,不能自动成为list,也不能成为set,dict也不行,就是tuple)

(1, 2, 3, '4', 5)
<class 'tuple'>

于是我们想,python解包原理可以给多个变量同时赋值,看看会发生什么?

def checkContentAndType(obj):
    print(obj)
    print(type(obj))

if __name__=="__main__":
    tupleTest1,tupleTest2=1,2,3,'4',5
Traceback (most recent call last):
  File "C:/Users/avatu/PycharmProjects/play/坑爹的初始化.py", line 6, in <module>
    tupleTest1,tupleTest2=1,2,3,'4',5
ValueError: too many values to unpack (expected 2)

Process finished with exit code 1

emmmmm,果然,不能这样做,稍微修改一下:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))

if __name__=="__main__":
    tupleTest1,tupleTest2=1,(2,3,'4',5)
    checkContentAndType(tupleTest1)
    checkContentAndType(tupleTest2)
1
<class 'int'>
(2, 3, '4', 5)
<class 'tuple'>

Process finished with exit code 0

和之前的经验不冲突,第一个果然还是变成了个int,后面的成功分配给第二个标识符,成为了一个元组......

再改一改:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))

if __name__=="__main__":
    tupleTest1,tupleTest2=(1,2,3),('4',5)
    checkContentAndType(tupleTest1)
    checkContentAndType(tupleTest2)
(1, 2, 3)
<class 'tuple'>
('4', 5)
<class 'tuple'>

Process finished with exit code 0

emmmmm,没被毛病,按照预计运行了.很好...!

关于很多书上都说,元组的元素不能修改

我们来看一个诡异的例子:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))


if __name__ == "__main__":
    tuple1 = ([1], 2, 'str-1', 'str-2')
    for i in range(len(tuple1)):
        if i == 0:
            tuple1[i].append('Pep8 is fun')
        print(tuple1[i])

结果:

[1, 'Pep8 is fun']
2
str-1
str-2

Process finished with exit code 0

哎呦,我去,怎么改了????

然而,真的改了吗?...再看下面例子:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))


if __name__ == "__main__":
    tuple1 = ([1], 2, 'str-1', 'str-2')
    for i in range(len(tuple1)):
        if i == 0:
            # tuple1[i].append('Pep8 is fun')
            tuple1[i]=[1,'Pep8 is fun']
        print(tuple1[i])

结果:

Traceback (most recent call last):
  File "C:/Users/avatu/PycharmProjects/play/坑爹的初始化.py", line 11, in <module>
    tuple1[i]=[1,'Pep8 is fun']
TypeError: 'tuple' object does not support item assignment

Process finished with exit code 1

嗯?怎么append()可以,赋值就不行了呢?

其实很简单.我们说python是完全面向对象的语言,那么一个int,一个list,都是一个对象,元组里面并不是把对象本身给塞进去了,而是把对象的指针给塞进去了!!!

看完下面这个例子就明了啦:

def checkIdAndValue(obj):
    print(id(obj))
    print(obj)

if __name__ == '__main__':
    list1 = [1, 2, 3]
    checkIdAndValue(list1)

    list1.append(4)
    checkIdAndValue(list1)

结果:

2603360595784
[1, 2, 3]
2603360595784
[1, 2, 3, 4]

Process finished with exit code 0

你看,append()并没有改变原有list的id()...也就是说,地址没变啊!想想C语言....数据结构的首地址 bla bla bla......

再看等号:

def checkIdAndValue(obj):
    print(id(obj))
    print(obj)

if __name__ == '__main__':
    list1 = [1, 2, 3]
    checkIdAndValue(list1)

    list1.append(4)
    checkIdAndValue(list1)

    list1 = [1, 2, 3, 4]
    checkIdAndValue(list1)

结果:

2596211797832
[1, 2, 3]
2596211797832
[1, 2, 3, 4]
2596211888584
[1, 2, 3, 4]

Process finished with exit code 0

对象的id发生变化了啊!

这样,就明白了,元组里面元素"可以被改变"的表象下,深层的原理:锁定的是一个指向对象的地址,但不是锁定了这个对象.

同样的原理:

def checkContentAndType(obj):
    print(obj)
    print(type(obj))


if __name__ == "__main__":
    tuple1 = ([1], {2, 3},{4:5, 6:7}, 'str-1', 'str-2')
    for i in range(len(tuple1)):
        if i == 0:
            tuple1[i].append('Pep8 is fun')
        elif i == 1:
            tuple1[i].add('Pep8 is fun')
        elif i == 2:
            tuple1[i][8] = 9 #K-V操作
        print(tuple1[i])

结果:

[1, 'Pep8 is fun']
{2, 3, 'Pep8 is fun'}
{4: 5, 6: 7, 8: 9}
str-1
str-2

Process finished with exit code 0

凡是这种修改后不造成id()变化的操作,都能从表面上去改变一个元组.

你看,以前学的值引用和址引用的知识用上了吧? 哈哈

© 著作权归作者所有

共有 人打赏支持
Oh_really

Oh_really

粉丝 4
博文 47
码字总数 13674
作品 0
郑州
程序员
加载中

评论(2)

Oh_really
Oh_really
顺便说一句,那些给你说不学C语言一样能学好python的人,你自己判断一下这些人的编程水平究竟怎么样吧()
Oh_really
Oh_really
补充一下:
a = 1,
这样写,得到的也是一个tuple
Python3开发随记(2)实例

<碎碎念> 今天在公司终于把jQuery搜索插件的功能写完了,已经能实现同步GET提交查询参数并正确显示视图,重构了三遍自己才觉得代码凑合能看,和高手还是有距离的,继续努力吧。 晚上继续看P...

hosealee
2016/04/13
98
0
Python3开发随记(1)关键要素

<碎碎念> 2月换了工作,由于工作原因学习了一些Python的基础,一开始在网上看了廖雪峰老师的Python2.7的教程,自己试着写了一些代码,突然发现越写越上瘾,然后想好好学习一下,所以买了Pyt...

hosealee
2016/04/09
67
0
Waston+Python,6行代码实现音频转文字,轻松做字幕~

几行代码,抱上IBM爸爸大腿,实现音频快速转文字~用到了IBM Waston的Speech to text(目前还是个demo) 碎碎念的废话~ 前几天工作中遇到需要把音频转为文字稿的任务,顺便学了个新词语:扒词...

莉莉安的向日葵
04/27
0
0
Python3开发随记(3)数据类型

<碎碎念> 上一个话题暂时不写了,直接写代码不好,还是先从基础开始吧 </碎碎念> Python3开发随记(3)数据类型 从这篇开始还是先看基础吧,直接看代码不好,另外我是一边看书一边写笔记的,...

hosealee
2016/04/17
72
0
【ZZ】python的打包和解包(tuple)

问题 你想去交换一些变量的值,但是你不想使用临时变量。 解决 python的自动元组打包和解包可以做到这点: a, b, c = b, c, a Python代码 a, b, c = b, c, a 讨论 许多程序语言让你使用临时中...

学徒1986
2013/09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习大数据为什么要先学Java?

计算机编程语言有很多,目前用的多一点的就是Java,C++,Python等等。目前大多数学习大数据的人都是选择学习Java,那Java到底好在哪呢?为什么学大数据之前要先学Java呢?我们今天就来分析一...

董黎明
24分钟前
0
0
php删除服务器所有session

php删除服务器所有session踢掉所有在线用户linux 注意:如果要删除服务器上所有session,重启php服务是解决不了问题的,php的session是持久化的。 有效解决办法: 删除 /tmp 下的所有文件(默...

妖尾巴
29分钟前
0
0
Ubuntu18.04 安装最新版WPS

1.手动卸载libreoffice:sudo apt-get remove --purge libreoffice* 2.官网下载WPS和字体: WPS:http://wps-community.org/download.html 字体:http://wps-community.org/download.html?vl......

AI_SKI
57分钟前
4
0
数据结构(算法)-图(深度优先搜索 DFS)

#include <iostream>using namespace std;#define MaxVex 30typedef char VertexType;typedef struct vexNode adjList[MaxVex];struct edgeNode{int adjvex;//邻接点......

ashuo
今天
1
0
1024 搞事倒计时!距程序员节还有 2 天!

详情请关注微信公众号:七牛云

七牛云
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部