分配期间是否更改了功能?
Are functions being changed during assignment?
我认为我很好地掌握了 Python 如何传递对象 (this article seemed enlightening)。
然后我尝试了一些简单的方法,只是将函数分配给变量。
class Thingy:
def __init__(self):
self.foo = {"egg": [1], "spam": [2]}
def calc(self):
self.foo["egg"][0] = 3
self.foo["spam"][0] = 4
def egg(self):
return self.foo["egg"][0]
def spam(self):
return self.foo["spam"]
thingy = Thingy()
x = thingy.egg()
y = thingy.spam()
print(x) # prints 1
print(y[0]) # prints 2
print(thingy.foo)
thingy.calc()
print(x) # prints 1 (???)
print(y[0]) # prints 4
print(thingy.foo)
我不完全确定发生了什么,尤其是当字典中的值已更新时。我的猜测是,当变量 x
被赋值时,它实际上指的是一个函数,其 return 值已经被计算为“1”。
我的理解对吗?我希望能清楚地解释为什么 Python 决定以不同的方式对待 .egg()
和 .spam()
。
当你运行
x = thingy.egg()
thingy.egg()
return 一个 int 与 foo["egg"][0] 中的值相同 ans 被分配给 x 而
y = thingy.spam()
thingy.spam() returns 包含 4 的列表与 foo["spam"]
相同。这与对象可变性有关。在您的计算函数中,2 个整数 foo["egg"][0]
和 foo["spam"][0]
被重新定义为新对象。然而,这些列表作为同一个对象包含在 remaine 中。由于 x 指的是整数,它仍然是旧对象,所以 1 和 y 也是同一个对象,但是该对象是一个列表,它的第一个元素现在指的是新的 int 对象 是 4
声明
x = thingy.egg()
y = thingy.spam()
创建 x
作为整数和 y
作为列表。但您必须知道,y = thingy.spam()
行只是一个浅拷贝。
这就是 medium 定义浅拷贝的方式:
Shallow copy is a bit-wise copy of an object. A new object is created that has an exact copy of the values in the original object. If any of the fields of the object are references to other objects, just the reference addresses are copied i.e., only the memory address is copied.
所以变量 y
包含列表元素的地址(或更外行术语中的引用),并且更改列表也会更改它,这与 x
不同,其中新的内存位置已分配。
我认为我很好地掌握了 Python 如何传递对象 (this article seemed enlightening)。
然后我尝试了一些简单的方法,只是将函数分配给变量。
class Thingy:
def __init__(self):
self.foo = {"egg": [1], "spam": [2]}
def calc(self):
self.foo["egg"][0] = 3
self.foo["spam"][0] = 4
def egg(self):
return self.foo["egg"][0]
def spam(self):
return self.foo["spam"]
thingy = Thingy()
x = thingy.egg()
y = thingy.spam()
print(x) # prints 1
print(y[0]) # prints 2
print(thingy.foo)
thingy.calc()
print(x) # prints 1 (???)
print(y[0]) # prints 4
print(thingy.foo)
我不完全确定发生了什么,尤其是当字典中的值已更新时。我的猜测是,当变量 x
被赋值时,它实际上指的是一个函数,其 return 值已经被计算为“1”。
我的理解对吗?我希望能清楚地解释为什么 Python 决定以不同的方式对待 .egg()
和 .spam()
。
当你运行
x = thingy.egg()
thingy.egg()
return 一个 int 与 foo["egg"][0] 中的值相同 ans 被分配给 x 而
y = thingy.spam()
thingy.spam() returns 包含 4 的列表与 foo["spam"]
相同。这与对象可变性有关。在您的计算函数中,2 个整数 foo["egg"][0]
和 foo["spam"][0]
被重新定义为新对象。然而,这些列表作为同一个对象包含在 remaine 中。由于 x 指的是整数,它仍然是旧对象,所以 1 和 y 也是同一个对象,但是该对象是一个列表,它的第一个元素现在指的是新的 int 对象 是 4
声明
x = thingy.egg()
y = thingy.spam()
创建 x
作为整数和 y
作为列表。但您必须知道,y = thingy.spam()
行只是一个浅拷贝。
这就是 medium 定义浅拷贝的方式:
Shallow copy is a bit-wise copy of an object. A new object is created that has an exact copy of the values in the original object. If any of the fields of the object are references to other objects, just the reference addresses are copied i.e., only the memory address is copied.
所以变量 y
包含列表元素的地址(或更外行术语中的引用),并且更改列表也会更改它,这与 x
不同,其中新的内存位置已分配。