python - 为什么 Python 中变量赋值的行为不同?

标签 python variables

我是 Python 新手,我对以下代码感到很困惑:

示例1:

n = 1
m = n
n = 2
print(n)   # 2
print(m)   # 1

示例2:

names = ["a", "b", "c"]
visitor = names
names.pop()
print(names)      # ['a', 'b']
print(visitor)    # ['a', 'b']

示例 1 显示 n是 1 且 m是 1。但是,示例 2 显示 names是 ['a', 'b'] 和 visitor也是 ['a', 'b']。

对我来说,示例 1 和示例 2 很相似,所以我想知道为什么结果如此不同?谢谢。

最佳答案

这是根本的区别。在第一种情况下,使用整数:

n = 2

不会改变n的内容。这是因为赋值不是突变。然而,在第二种情况下:

names.pop()

您正在调用方法.pop,它是一个更改器(mutator)方法

就是这样。请注意,您可以使用列表获得与第一种情况完全相同的行为:

>>> n = []
>>> m = n
>>> n = ['hi']
>>> print(n)
['hi']
>>> print(m)
[]

因为赋值没有改变任何东西。

请注意,int 对象不公开任何变异方法,即它们是“不可变的”。当然,这并不魔法

我们可以使用实现细节来深入了解 int 的内部并实际改变它。

>>> import ctypes
>>> my_integer = 1337
>>> pointer = ctypes.cast(id(my_integer), ctypes.POINTER(ctypes.c_int))
>>> pointer[6] = 99
>>> my_integer
99

好的,现在,让我们重新创建原来的示例,这次使用这种方法来改变不可变 int:

>>> n = 1337 # not messing with lower valued ints because they are cached
>>> m = n
>>> ctypes.cast(id(n), ctypes.POINTER(ctypes.c_int))[6] = 999
>>> print(n)
999
>>> print(m)
999

注意,上面的内容是根据 Python 3.11 编写的。更高版本可能会更改 int 对象的布局,因此不保证 pointer[6] = another 有效。

关于python - 为什么 Python 中变量赋值的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77153141/

相关文章:

python - 显示表单内容而不是表单对象名称

python - 将整数列表分解为递增序列列表

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

c - 如何增加数组中变量的值(C 编程)

python - Pyinstaller编译的exe找不到绝对路径的文件

python - 如何向 python(矩阵)多维数组添加列?

python - Django:我的函数返回一个对象而不是返回值

php代码写入变量

java - 无法在 main() 方法中实例化字段(实例变量)。为什么?? java

vba - 隐藏变量声明 VBA