python 变量赋值引用的一点学习笔记

变量保存的是引用,这一点对 Python 编程有很多实际的影响。

简单的赋值不创建副本。
举例:
a = 1

对 += 或 *= 所做的增量赋值来说,如果左边的变量绑定的是不可变
对象,会创建新对象;如果是可变对象,会就地修改。
举例:

a = [1,2,3]
b = a
a += [1] [1,2,3,1]
a is b  # True

a = (2,3)
b = a  #(2,3)
a += (1,)  # (1,2,3)
a is b # False

为现有的变量赋予新值,不会修改之前绑定的变量。这叫重新绑
定:现在变量绑定了其他对象。如果变量是之前那个对象的最后一
个引用,对象会被当作垃圾回收。

a = 1  # a = 1
b = a  # b = 1
a = 3  # a = 3  这个叫做重新绑定
# 如果a = 4 这个时候3这个对象就会被回收.

函数的参数以别名的形式传递,这意味着,函数可能会修改通过参
数传入的可变对象。这一行为无法避免,除非在本地创建副本,或
者使用不可变对象(例如,传入元组,而不传入列表)。

class HauntedBus:
    def __init__(self, passengers=[]):
        self.passengers = passengers
    def pick(self, name):
        self.passengers.append(name)
    def drop(self, name):
        self.passengers.remove(name)

bus1 = HauntedBus(['alice', 'bill'])
print bus1.passengers #['alice','bill']
bus1.pick('charlie')
bus1.drop('alice')
print bus1.passengers #['bill', 'charlie']
# ------------------关键点-----------------
bus2 = HauntedBus()  #bus2是空的,因此把默认的空列表赋值给self.passengers
bus2.pick('Carrie')
bus2.passengers # ['Carrie']
bus3 = HauntedBus()  # bus3也是空的,因此用的也是默认列表.但是这个时候,默认的列表不为空!
print bus3.passengers # ['Carrie']
bus3.pick('Dave')
bus2.passengers # ['Carrie', 'Dave']
bus2.passengers is bus3.passengers # True

使用可变类型作为函数参数的默认值有危险,因为如果就地修改了
参数,默认值也就变了,这会影响以后使用默认值的调用。

class TwilightBus:  
       def __init__(self, passengers=None):
           if passengers is None:
               self.passengers = [] #当passengers为None时,创建一个新的空列表
           else:       
               self.passengers = passengers #然而,这个赋值语句把self.passengers 变成 passengers 的别名,而basketball_team是传递给__init__方法的实参.

       def pick(self, name):                                                 
              self.passengers.append(name)  #相当于对列表进行了操作!!!

       def drop(self, name):
           self.passengers.remove(name)  # 相当于对列表进行了操作!!!


   basketball_team = ['Sue', 'Tina', "Maya", "Diana", "Pat"]
   bus = TwilightBus(basketball_team)
   bus.drop('Tina')    
   bus.drop("Pat")     
   print basketball_team #['sue','Maya','Diana']
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值