你说:
在Python中,变量赋值意味着将新变量分配给它
自己的内存而不是指向原始内存的指针(来自我的
了解如果这不正确,请告诉我):
这是不正确的。 Python 名称可以具有(有时)类似于 C 变量的方面,也可以具有(有时)类似于 C 指针的方面。试图说它们是其中之一只是令人困惑。不。将它们视为 Python 的独特且惯用的。
Python“变量”更应该被视为名称。超过一个may即使您无意,也会引用相同的内存位置。
Example:
>>> y=7
>>> x=7
>>> x is y
True
>>> id(x)
140316099265400
>>> id(y)
140316099265400
并且(由于实习 http://en.wikipedia.org/wiki/String_interning, 下列may是真实的。看PEP 237 http://legacy.python.org/dev/peps/pep-0237/关于短整数的实习,但这是一个实现细节):
>>> x=9
>>> y=5+4
>>> x is y
True
蟒蛇is
如果比较两个对象的内存地址是相同的对象,则运算符返回 True。这id
函数返回该地址。
考虑最后一个例子:
>>> li1=[1,2,3]
>>> li2=[1,2,3]
>>> li1==li2
True
>>> li1 is li2
False
即使 li1 == li2,它们也必须是单独的列表,否则如果您更改其中一个,它们都会更改,如下例所示:
>>> li1=[1,2,3]
>>> li2=li1
>>> li1.append(4)
>>> li2
[1, 2, 3, 4]
>>> li1==li2
True
>>> li1 is li2
True
(一定要理解另一个经典错误 https://stackoverflow.com/q/240178/298607所有 Python 程序员迟早都会犯这样的错误。这是由于对单个可变对象的多个引用,然后期望一个引用充当单个对象而引起的。)
正如 jonrsharpe 在评论中指出的那样,阅读 Ned Batchelders 的精彩文章关于 Python 名称和值的事实和神话 http://nedbatchelder.com/text/names.html or 如何像Pythonista一样思考 http://python.net/~mwh/hacks/objectthink.html以获得更详细的概述。