【问题标题】:deepcopy() returns an AttributeError with a listdeepcopy() 返回一个带有列表的 AttributeError
【发布时间】:2023-02-26 05:11:14
【问题描述】:

这是一个示例脚本,用于缩小我在较大的 Blender 脚本中遇到的问题。它返回 AttributeError: 'list' object has no attribute。

import mathutils
from copy import deepcopy
    
a=10
v = mathutils.Vector((0, 0))
list = [1,v]
    
a = list
b = list
b[1][0] = 1000
print(a)

a = list.deepcopy()
b = list.deepcopy()
b[1][0] = 5500
print(a)

任何见解将不胜感激。

谢谢

【问题讨论】:

    标签: list copy


    【解决方案1】:

    脚本的问题在于列表变量被分配为 Python 列表,这是一种可变数据类型。因此,当您分配Ab要列出,它们都引用相同的底层对象。因此,对b也会影响A.

    在第一种情况下,当您分配b[1][0] = 1000,它会更改原始列表中 v 向量的第一个元素,这会同时影响 a 和 b。这就是为什么当您打印 a 时,它会显示更新后的矢量值。

    在第二种情况下,当你打电话深拷贝()列表,它会创建列表对象及其所有元素的新副本。但是,那深拷贝()方法不是 Python 列表的内置方法。它仅适用于某些类型的对象,例如字典和集合。因此,当您尝试调用深拷贝()列表,它提出了一个属性错误.

    要解决此问题,您可以使用复制()创建列表的浅表副本的方法,它创建一个新列表但与原始列表共享相同的元素,或者使用深拷贝()创建矢量对象的新副本而不是整个列表对象的方法。 您可以尝试以下脚本,看看会发生什么。很可能这将顺利运行而无需任何属性错误

    import mathutils
    from copy import deepcopy
    
    a = 10
    v = mathutils.Vector((0, 0))
    lst = [1, v]
    
    a = lst.copy()
    b = lst.copy()
    b[1][0] = 1000
    print(a)
    
    a = deepcopy(lst)
    b = deepcopy(lst)
    b[1][0] = 5500
    print(a)
    

    希望,这将解决您的问题....

    【讨论】:

      猜你喜欢
      • 2020-01-26
      • 2022-06-15
      • 2014-01-24
      • 2018-02-26
      • 2016-05-20
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多