运行下面这样一段代码,会输出什么呢?
person = {'name':'','id':0}
team = []
for i in range(3):
x = person
x['id'] = i
team.append(x)
team[0]['name'] = 'jack'
team[1]['name'] = 'pony'
team[2]['name'] = 'ivy'
print(team[0],team[1],team[2])
如果你的结果不是{'name': 'ivy', 'id': 2} {'name': 'ivy', 'id': 2} {'name': 'ivy', 'id': 2}
,可以继续往下看,也许会对你有所帮助。
在某些编程语言中,变量像是一个“容器”,定义了某种类型的变量,就给你分配好这个容器,之后对变量作赋值操作,就像是往容器里装入不同的内容,但容器还是那个容器,不会变。你创建3个容器,赋给一样的值,他们也还是3个独立的容器。
然而,
在 Python 中,变量更像是一个“标签”,执行下面的代码
a = [1, 2]
b = a
a[0] = 2
print(a,b)
此时输出结果应该是[2,2],[2,2]
,而不是[2,2],[1,2]
。
在Python中,
当一个名字第一次出现在赋值语句的左边部分时,会创建对应的 Python 变量,赋值语句将名字与值关联起来,变量存的是指向数据的引用,而不是数据本身。
来看下面的代码
theSum = 0
print(type(theSum))
theSum = True
print(type(theSum))
执行过后,我们会发现theSum
的数据类型由整数类型–>布尔类型,赋值语句改变了变量的引用,
这体现了 Python 的动态特性,同一个变量可以指向不同类型的数据。
我们之前说变量像是一个“容器”时提到,“你创建3个容器,赋给一样的值,他们也还是3个独立的容器”。
那在 python 中,同样的值赋给不同的变量,是否就一定意味着不同的变量指向同一个引用呢?
答案是 NO! 可能一致,也能不一致。
那如果想知道是否一致呢,执行如下代码
a = -100
b = -100
c = False
if id(a) == id(b):
c = True
print(c)
改变不同的赋值,会有不同的结果。
此时,再看最开始的例子,是否理解了呢
参考:
- https://zhuanlan.zhihu.com/p/90484197
- https://zhuanlan.zhihu.com/p/20721034