python相加赋值的小疑问
为什么相加的值不直接给原来的地址就好了,而是要另开一块地址?
是怕相加溢出吗??
感觉这样写很繁琐。。。 你纠结这个干什么,python设计就是这样的
没有变量,只有标签,当指向内存地址的标签数量为0的时候
垃圾回收机制启用,清空这段内存
例如:
x = 1
x = x + 1# 这里执行之后,之前的x标签指向的地址就被回收了 我自己解答一波。。。
好像是有广播机制,两个形状不同的矩阵相加,两个矩阵会自动复制原来的元素扩展到相同大小
如果放原来的内存肯定放不下了,所以要开新的地址。。。 这和矩阵无关索引操作的赋值必须是实现了魔术方法__setitem__
x = 1;x = x + 1这种 int类型根本没实现__setitem__ 也就用不了索引操作
元组和字符串类也只是实现了__getitem__ 索引操作也是只读 不能修改 修改字符串的一部分操作是不可能 比如replace 是生成新的字符串
而对列表的切片赋值 x[:] = new_lite 无疑是架空了原列表 不会生成新列表 列表的大部分方法也都是修改原列表
笨鸟学飞 发表于 2020-11-4 11:09
你纠结这个干什么,python设计就是这样的
没有变量,只有标签,当指向内存地址的标签数量为0的时候
垃圾 ...
不是纠结,主要是原来学的C、C++都不是这样用的,搞清楚为什么,下次用到不会出错 kogawananari 发表于 2020-11-4 14:19
这和矩阵无关索引操作的赋值必须是实现了魔术方法__setitem__
x = 1;x = x + 1这种 int类型根本没实现_ ...
哦 大概意思是不是还是为了保护原来的数据不被修改 这和保护不搭架的
例如设置x=1
它是新内存地址→写数据1→定义标签x
x或其他的指向1的标签还在,这内存地址和数据就都还在
标签一个都没有了,那内存地址和数据都被垃圾回收了,都不存在了
你以为的对变量赋值是修改原内存地址的数据,其实并不是
他是重新申请内存,重新写数据,在把标签指向给改了。。。
========何以见得?请看实例===========
>>> x = 1
>>> id(x)
2009573296
>>> x = 2
>>> id(x)
2009573312
笨鸟学飞 发表于 2020-11-7 20:04
这和保护不搭架的
例如设置x=1
它是新内存地址→写数据1→定义标签x
c和c++、java这些应该不是这种机制吧。。
这种机制主要还是因为python没有声明数据类型吧
页:
[1]