找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4210|回复: 8

[已解决] 弄不懂变量赋值时传递值还是地址的规则。

2

主题

3

帖子

3

积分

贫民

积分
3
silent_hunter 发表于 2017-2-3 21:38:28 | 显示全部楼层 |阅读模式
第一种情况,当x还是空字典的时候赋值给y,y也应该是空字典,接着给字典x加内容,发现y的值也变化。如此看来y=x传递的是地址。
  1. x = {}
  2. y = x
  3. x["key1"] = "value1"
  4. print y
复制代码

第二种情况,既然把字典x重置为空字典了,那y指向同一个地址,为什么不是空的?
  1. x = {}
  2. y = x
  3. x["key1"] = "value1"
  4. x = {}
  5. print y
复制代码

第三种情况,是普通变量,好像传递的又不是地址。
  1. a = 11
  2. b = a
  3. a = 99
  4. print b
复制代码

以上三种情况我对python的赋值规则有些糊涂。请教一下各位如何理清楚。
回复

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2017-2-5 11:36:50 | 显示全部楼层
python的变量看作标签比较好一些。
x={},可以看作,python分配一段内存给字典,并将x这个标签贴在了这段内存上
y=x,可以看作,将y这个标签也贴在了这段内存上
改变x,y也跟着改变,因为他们对应同一段内存
x={},再次赋值x,python分配一段内存给另一个字典,并将x标签贴上。这段内存和y所对应的地址已经不同,所以不会互相影响。

其他变量也是这样
python3.4.4, win10
回复 支持 1 反对 0

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2017-2-4 21:51:49 | 显示全部楼层
python中万物皆对象
变量与变量之间的 = 确实是传递地址
但是 例子2中的 x = {} 就相当于 x = new {},x重新指向了一个新的字典,但是y还是指向原来的字典地址啊
例子3中的a = 99 也是同理的
回复 支持 反对

使用道具 举报

2

主题

3

帖子

3

积分

贫民

积分
3
silent_hunter  楼主| 发表于 2017-2-6 13:19:10 | 显示全部楼层
maximal_ideal 发表于 2017-2-4 21:51
python中万物皆对象
变量与变量之间的 = 确实是传递地址
但是 例子2中的 x = {} 就相当于 x = new {},x重 ...

若第二次x={}指向一个新字典,那原来的字典不就成了孤魂野鬼?如果没有y,那引用不到了。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
嘿嘿雷 发表于 2017-2-6 14:13:01 | 显示全部楼层
silent_hunter 发表于 2017-2-6 13:19
若第二次x={}指向一个新字典,那原来的字典不就成了孤魂野鬼?如果没有y,那引用不到了。 ...

确实是个问题,我是没有重新这么再赋值过,楼主有这种需求吗?
回复 支持 反对

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2017-2-7 20:49:11 | 显示全部楼层
silent_hunter 发表于 2017-2-6 13:19
若第二次x={}指向一个新字典,那原来的字典不就成了孤魂野鬼?如果没有y,那引用不到了。 ...

安心洗路   系统会回收的
回复 支持 反对

使用道具 举报

6

主题

18

帖子

18

积分

贫民

积分
18
马克思和臭皮匠 发表于 2017-2-8 23:03:06 | 显示全部楼层
maximal_ideal 发表于 2017-2-4 21:51
python中万物皆对象
变量与变量之间的 = 确实是传递地址
但是 例子2中的 x = {} 就相当于 x = new {},x重 ...

借个楼求问一下  如何在保留a的值情况下,改变b而不影响a,即让两段内存的地址不重合
a = [1,2,3]
b= a
a[0] -=1
print "a %r b %r" %(a, b)
得到的结果a, b 还是同时改变的
回复 支持 反对

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2017-2-13 13:01:26 | 显示全部楼层
马克思和臭皮匠 发表于 2017-2-8 23:03
借个楼求问一下  如何在保留a的值情况下,改变b而不影响a,即让两段内存的地址不重合
a = [1,2,3]
b= a

用deep copy
import copy
b = copy.deepcopy(a) ~
回复 支持 反对

使用道具 举报

1

主题

9

帖子

9

积分

贫民

积分
9
portkiller 发表于 2017-2-24 03:05:25 来自手机 | 显示全部楼层
id()看一下内存地址
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表