【问题标题】:Copying list "ties" the original list复制列表“绑定”原始列表
【发布时间】:2021-12-30 19:19:07
【问题描述】:

所以我在 pygame 中测试了一件有趣的事情。我知道这段代码很糟糕,但这只是一个测试。 在这个程序中,我有一个代表 pygame 多边形的列表和它们的列表。在函数中,它返回更改的列表来绘制它。 但由于某种原因,无论我多么努力,它都会改变原来的“多边形”列表。但是,如果我将“mor”变量设置为“多边形”列表的 ctrl + c ctrl + v,它就可以正常工作 我疯了吗? .copy() 不应该创建不相关的列表吗?为什么“六边形”会发生变化?

import pygame

pygame.init()
sc = pygame.display.set_mode((1000, 1000))
clock = pygame.time.Clock()
WHITE = (255,255,255)
hexagon = [WHITE,[[669,207],[615,240],[615,305],[669,335],[725,305],[725,240]],8]
hexagon2 = [WHITE,[[669,335],[725,305],[725,240],[669,207],[615,240],[615,305]],8]
hexs = [hexagon,hexagon2]
hex = pygame.Surface((1000,1000))
state = 0
def morph (states,first):
    global state
    done = 0
    current = first
    for i in current[1]:
        a = 0
        for n in i:
            try:
                if n < states[state+1][1][current[1].index(i)][a]:
                    current[1][current[1].index(i)][a] += 1
                elif n > states[state+1][1][current[1].index(i)][a]:
                    current[1][current[1].index(i)][a] -= 1
                else:
                    done += 1
            except:
                if n < states[0][1][current[1].index(i)][a]:
                    current[1][current[1].index(i)][a] += 1
                elif n > states[0][1][current[1].index(i)][a]:
                    current[1][current[1].index(i)][a] -= 1
                else:
                    done += 1
            a += 1
    if done == len(current[1])*2:
        if state + 1 <= len(states):
            state += 1
        else:
            state = 0
    return current
run = True
mor = hexagon[:]
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    hex.fill((0,0,0))
    mor = morph(hexs,mor)
    pygame.draw.polygon(hex,*mor)
    sc.blit(hex,(0,0))
    pygame.display.update()
    clock.tick(60)

pygame.quit()
exit()

再次抱歉,糟糕的代码和糟糕的英语

【问题讨论】:

  • "不应该 .copy() 创建不相关的列表" -- deep copy(这是你想要的)和 shallow 之间是有区别的复制(这是您正在创建的)。
  • 你从来没有真正在任何地方打电话给.copy()。也就是说,hexagon[:] 是一个 shallow 副本。请参阅 copy 模块,特别是 copy.deepcopy 函数,用于复制深度嵌套的结构。

标签: python


【解决方案1】:

其实这是一个非常有趣的问题!

正在发生的是浅拷贝,而不是您想象的深拷贝。对于大多数人来说,需要注意的是python来自C语言,并且存在一个称为指针的概念。 “指针”是对内存位置的引用,而不是对“值”本身的引用。

为了更好地理解脚本:

l1 = [1,2]
id(l1) # addr 140028122641088

# here the attribution works like a shallow copy
l2 = l1
id(l2) # addr 140028122641088

# here we make a deep copy, also knows a "copy by value"
import copy
l2 = copy.deepcopy(list)
id(l2) # addr 140028122642816

deepcopyid的参考

【讨论】:

  • 大概您打算将id(list) 的第二次和第三次使用实际上是id(list2)...
  • 另外,最好不要使用诸如 list 这样的内置名称。
  • 谢谢!每天我都在编程中学到一些东西:)
  • 感谢@JohnGordon,我根据您的反馈编辑我的答案
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2023-03-18
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多