代码急转弯——什么是变量?


标题有点拗口,实际上是在问变量是什么?

1、什么是赋值?

百度百科中,将赋值定义为:“将某一数值赋给某个变量的过程,称为赋值。”这种定义将变量视作一个内存地址,用该地址指定的一小块存储空间存储数据,可直观想象为一个房间,变量的地址即为房间的门牌号,赋值意味着把数据存入房间。x = 1意味着把1保存到id(x)地址的房间中,y = 1意味着把1保存到id(y)地址的房间中。现在有两个房间,里面各自保存了一个1,所以有两个1。

2、python 的变量是一个标签

python变量却有另一种含义,它把变量赋给某项数据,即变量是一个标签,类似于贴在房间大门上的名字,如花好厅、月圆厅、总统套间等。一个房间只有一个地址,不同房间的地址不能重复,但是一个房间却可以有多个标签,好比说一个人有多个名字。x = 1意味着把x贴在装有1的房间上,y = 1意味着把y也贴到同一个房间上,现在有一项数据1,而变量有两个,果真如此?

x = 1
y = 1
z = 6//3-y
print(id(x))
print(id(y))
print(id(z))

运行结果表明x、y有相同的地址,计算得到的z也有相同的地址。

140727688012176
140727688012176
140727688012176

3、x = y 是何意?

现在明确了,变量有两种:作为地址的变量和作为标签的变量。
对于地址变量,x = y 执行了拷贝操作,将y地址的数据复制到x地址处。
对于标签变量,x = y 执行了贴标签的操作,将y标签粘贴和x标签贴到一起,导致相应的数据上多了一个标签,把它说成引用计数为2。
请写出下列代码的执行结果

x = 1
y = x
y = 2
print(x)

为什么结果为 1?
x = 1   数据 1 上贴标签 x
y = x   数据 1 上再贴标签 y,现在有两个标签
y = 2   把 y 贴到数据 2 上,
print(x)  x 没有挪位置,所以x的值还是 1

4、x += 1 是赋值吗?
print(id(1))
print(id(2))

x = 1
print(id(x))
x += 1
print(id(x))

运行结果表明,x的地址变了,已经由原来贴在1处挪到了2的位置。

140727688012176
140727688012208
140727688012176
140727688012208
5、x += [1] 是赋值吗?

变量有名称、类型和数据三要素。
对于整数、小数等基本类型的数据,称为不可变数据类型,即赋值语句不改变变量的值,而只是让变量引用其他位置的数据。
对于列表、集合等容器类型的数据而言,其元素是可变的,称为可变数据类型,可用赋值语句改变容器中的元素,如下列代码为列表添加了新元素,使得列表变长了,但是标签并没有挪位置。

x = [1]
print(id(x))
x += [2]
print(id(x))
print(x)

运行结果

2404361968264
2404361968264
[1, 2]
6、x[:] = [1] 与 x = [1] 有何不同?
x = []
print(id(x))
x = [1]
print(id(x))
x[:] = [2]
print(id(x))
print(x)

x = [1] 是重贴标签,x[:] = [2] 则是赋值,修改了0号元素(0号元素本身是个标签)。

2404362395464
2404362385480
2404362385480
[2]

结论,python像是C的指针,而不似C的普通变量。x=…也没有拷贝数据(赋值)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值