回应模式 - No.63952357


No.63952357 - 技术宅


无标题无名氏No.63952357 只看PO

2024-10-02(三)11:40:35 ID:4kTyLpO 回应

发现一个问题( ゚∀。)Python的
>>>a=b=[]
>>>a.append(1)
这个时候a和b两个列表都会添加一个1( ゚∀。)是因为连等定义共用一个内存地址吗

无标题无名氏No.63953502

2024-10-02(三)14:02:31 ID: 4Sv4ob7

是的,你可以试一下id(a),id(b),就会发现这两个变量名(标识符)指向的是同一个对象

无标题无名氏No.63953539

2024-10-02(三)14:07:26 ID: 5IJAv3m

常见的面向对象的值语义语言大概就C++
其他的行为都类似于这样,不指定拷贝绑定的是引用
于是就一起改了

无标题无名氏No.63953610

2024-10-02(三)14:15:04 ID: YiXpQ4t

python的list是对象,不是标量。
标量会复制,对象会传引用

无标题无名氏No.63953619

2024-10-02(三)14:16:00 ID: 4kTyLpO (PO主)

看来只能这么解决了( ´д`)

无标题无名氏No.63953651

2024-10-02(三)14:18:58 ID: YiXpQ4t

为啥不能
a=[]
b=[]

无标题无名氏No.63953671

2024-10-02(三)14:20:37 ID: YiXpQ4t

哦想复制list是吧
b=[x for x in a]

或者更进阶一点对于复杂嵌套对象可以看看copy.deepcopy

无标题无名氏No.63953725

2024-10-02(三)14:26:14 ID: 4kTyLpO (PO主)

>>No.63953671
谢肥哥( ゚∀。)查到深拷贝的方法了,但是测试了一下发现我最需要的是完全洗内存地址,先转字符串再等效貌似最方便,好像还有什么可变对象和不可变对象之类的区别,小白看不懂啦|д` )

无标题无名氏No.63953756

2024-10-02(三)14:29:15 ID: 4WVuFwF

>>No.63953671
复杂了
a=[]
b=a[:]

无标题无名氏No.63953768

2024-10-02(三)14:30:35 ID: 4WVuFwF

>>No.63953619
你这种转字符串的方法各种方面都不安全

非要转的话用json库来转