将相同的值赋给变量会产生不同的结果
Assigning same value to a variable yields a different result
在 python 编写游戏代码时,我遇到了部分代码问题。在一些调试过程中,我 运行 遇到了一些我无法解释的非常奇怪的事情。
我展示的第一个代码将某个值打印到数组 'polygon'。第二个代码是相同的,但最后我将第一个代码打印的值分配给数组 'polygon'。我显然希望程序的其余部分(我没有显示)以与第一个或第二个代码相同的方式运行,因为它们最终给 'polygon' 相同的值。然而,第二个代码使程序的其余部分工作,但第一个代码没有。
对于我的生活,我无法弄清楚发生了什么。我不提供程序的其余部分,因为我认为它是多余的,因为它在第一种情况和第二种情况下是相同的。
有人知道是什么原因造成的吗?感谢您的帮助。
第一个密码:
if 1:
dimensions = 3
polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
for limeJuice in range(dimensions-2):
p = copy.deepcopy(polygon)
for j in range(len(p)):
p[j][0].append(100)
p[j][1].append(100)
bob = copy.deepcopy(polygon)
for j in range(len(bob)):
bob[j][0].append(-100)
bob[j][1].append(-100)
q = []
for j in range(len(p)):
q.append([p[j][0],bob[j][0]])
polygon = []
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
print(polygon)
#rest of the programme
#--------------------------------------------------------------------#
#second code:
if 1:
dimensions = 3
polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
for limeJuice in range(dimensions-2):
p = copy.deepcopy(polygon)
for j in range(len(p)):
p[j][0].append(100)
p[j][1].append(100)
bob = copy.deepcopy(polygon)
for j in range(len(bob)):
bob[j][0].append(-100)
bob[j][1].append(-100)
q = []
for j in range(len(p)):
q.append([p[j][0],bob[j][0]])
polygon = []
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]
#rest of the programme
TLDR:第一个变体在您的数据之间共享引用,第二个则没有。
list
字面量和相等性都不表示与其他数据结构共享元素。具有相同文字或相等的两个对象仍然允许它们具有不同的共享数据。当您修改对象时,这会有所不同:
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> # copy by sharing elements
>>> b = [a[0], a[1]]
>>> # copy by literal value
>>> c = eval(repr(a))
>>> a == b == c
True
>>> a[1].append(7)
>>> a == b # b shares data with a
True
>>> a == c # c shares no data
False
在您的情况下,第一个 polygon
与您的其他列表共享其数据。从文字创建的第二个 polygon
仅包含新对象:
# share objects with polygon
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
# create new objects for polygon
polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]
如果您需要在程序中分别修改q
、bob
、p
和polygon
,记得copy.deepcopy
它们。
在 python 编写游戏代码时,我遇到了部分代码问题。在一些调试过程中,我 运行 遇到了一些我无法解释的非常奇怪的事情。 我展示的第一个代码将某个值打印到数组 'polygon'。第二个代码是相同的,但最后我将第一个代码打印的值分配给数组 'polygon'。我显然希望程序的其余部分(我没有显示)以与第一个或第二个代码相同的方式运行,因为它们最终给 'polygon' 相同的值。然而,第二个代码使程序的其余部分工作,但第一个代码没有。
对于我的生活,我无法弄清楚发生了什么。我不提供程序的其余部分,因为我认为它是多余的,因为它在第一种情况和第二种情况下是相同的。
有人知道是什么原因造成的吗?感谢您的帮助。
第一个密码:
if 1:
dimensions = 3
polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
for limeJuice in range(dimensions-2):
p = copy.deepcopy(polygon)
for j in range(len(p)):
p[j][0].append(100)
p[j][1].append(100)
bob = copy.deepcopy(polygon)
for j in range(len(bob)):
bob[j][0].append(-100)
bob[j][1].append(-100)
q = []
for j in range(len(p)):
q.append([p[j][0],bob[j][0]])
polygon = []
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
print(polygon)
#rest of the programme
#--------------------------------------------------------------------#
#second code:
if 1:
dimensions = 3
polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
for limeJuice in range(dimensions-2):
p = copy.deepcopy(polygon)
for j in range(len(p)):
p[j][0].append(100)
p[j][1].append(100)
bob = copy.deepcopy(polygon)
for j in range(len(bob)):
bob[j][0].append(-100)
bob[j][1].append(-100)
q = []
for j in range(len(p)):
q.append([p[j][0],bob[j][0]])
polygon = []
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]
#rest of the programme
TLDR:第一个变体在您的数据之间共享引用,第二个则没有。
list
字面量和相等性都不表示与其他数据结构共享元素。具有相同文字或相等的两个对象仍然允许它们具有不同的共享数据。当您修改对象时,这会有所不同:
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> # copy by sharing elements
>>> b = [a[0], a[1]]
>>> # copy by literal value
>>> c = eval(repr(a))
>>> a == b == c
True
>>> a[1].append(7)
>>> a == b # b shares data with a
True
>>> a == c # c shares no data
False
在您的情况下,第一个 polygon
与您的其他列表共享其数据。从文字创建的第二个 polygon
仅包含新对象:
# share objects with polygon
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
# create new objects for polygon
polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]
如果您需要在程序中分别修改q
、bob
、p
和polygon
,记得copy.deepcopy
它们。