python 变量引用

最近在看<<流畅的python>>关于变量引用部分时,有一些自己的看法,就再次记录一下.

问题:

# From flunet python example 8-8
class Bus:
    def __init__(self, passengers=[]):
        self.passengers = passengers

    def pick(self, name):
        self.passengers,append(name)

    def remove(self, name):
        self.passengers.remove(name)

>> bus1 = Bus()    # 实例化
>> bus2 = Bus()    # 实例化
>> bus1.append(‘Bob‘)
>>bus2.passengers    # bus2的passengers也有值
 [‘Bob‘]  

为什么bus1中passengers发生改变会导致bus2中passengers发生改变?

这说明两个Bus的实例共用了一个self.passengers,明明是两个实例?

在往上看,self.passengers引用的是passengers的值,也就是__init__中的形参(变量).这个参数在两个实例中是共用的,实例化的过程中,都会用到passengers这个list.

再仔细想一想,每一次实例化过程不都会新建一个passengers吗?这就是问题的所在.答案是passengers这个形参并不是在实例化过程中建立的,而是在方法定义的时就产生了.也就是因为在这个过程早于实例化过程,不同的实例才能共享passengers变量.

再定义一个函数:

def foo(x=[]):
    print id(x)

>> f1 = foo()
139916453629536
>> f2 = foo()
139916453629536

两次id是一样的,也说明参数x的内存空间是在函数定义时创建的

看看foo函数的默认参数变量以及id

>> foo.func_defaults
([],)
>> id(foo.func_defaults[0])
139916453629536

可以看到id的结果都是一样的,同样也验证了参数变量的内存空间是在调用之前(定义时)创建的.

回头看看,除了参数变量的引用之外,还有几点看法:

(1)方法和函数的参数引用方式是一致的,都是在定义时创建内存空间

(2)函数也是function类的实例

原文地址:https://www.cnblogs.com/chimpan/p/9426724.html

时间: 2024-09-28 05:06:51

python 变量引用的相关文章

【转】python共享引用(多个变量引用)示例代码

python共享引用(多个变量引用)示例代码_python_脚本之家http://www.jb51.net/article/44109.htm python单个(一个)对象被多个变量引用又是怎么一回事儿呢?看下面代码 a = 3b = a 先上图(图1)吧,大家一看就一目了然了: 变量名和对象,在运行赋值语句b = a之后,变量a,b都指向了对象3的内存空间. 假设这时执行 a = 'python', a将指向刚创建的字符串对象. 我们再来试试这种情况: >>>list_1 = [1,2

Python中的变量引用对象需注意的几点

Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须赋值.赋值后的变量指向响应的对象,拥有该对象的空间.类型属于对象,但是不是变量. [python] view plain copy a = 3 a = "science" 上述代码说明数值3和字符串"science"分别是两种对象,初始变量a赋值对象3被创建,变量a指向

Python 变量 对象 引用

1.变量 变量第一次赋值时被创建,变量在使用前必须赋值 变量本身没有类型,变量类型为它引用的对象类型: 变量在使用时被替换成它引用的对象 2.对象 对象本身具有计数和类型,变量引用对象,当对象的引用变为0的时候,回收对象内存.但是类似INT等小类型对象,不一定立马回收它的内存. 修改指向同一个可变对象的任何一个变量,都会影响到指向的对象,也就是两个变量的值都会被修改. >>> l=[1,2,9] >>> s= l >>> s[0]=11 >>

Python变量

1. 变量的命名 变量名由字母.数字或下划线组成,首字母必须是字母或下划线. 2. 变量的赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程.每个变量在内存中创建,都包括变量的标识,名称和数据这些信息.每个变量在使用前都必须赋值,赋值后该变量才会被创建. 3. 局部变量 局部变量是只能在函数或代码段内使用.函数或代码段一旦结束,局部变量的生命周期也将结束.局部变量的作用范围只在局部变量被创建的函数内有效.注意:Python创建的变量就是一个对象.Python会管理变量的

此变量非彼变量(python变量)

曾经很是好奇,python的变量怎么这么灵活,既不用声明其类型又可以各种随便赋值,后来深入学习就感觉着实有趣.Python中数字字符串等等都是对象,1是对象,"Hello"也是对象,每个对象都知道自己的类型,每个对象都有一个引用计数器,这个引用计数器是干嘛的呢,加入把对象"hello"赋值给变量a,即:a="hello" 这样a就是对象"hello"的一个引用,再把a赋值给b,即b=a,那么 a和b就指向同一个对象"

python 如何引用上级目录的模块

今天,做一个测试,想在当前python中引用上层目录的模块:呃,一番搜索. 先看一下目录情况: [[email protected] test]# tree . ├── t1.py ├── t2 │   └── t2.py └── xxu     └── test.py 2 directories, 3 files 其实,最开始仅仅是想,test.py中可以调用t1.py中函数: 直接使用的效果: [[email protected] xxu]# cat test.py  #/usr/bin/e

python变量内存浅析

1. Python变量 如果把单一值变量称为一维变量,把可以扩展元素的变量称为多维变量,则python的变量可以划分如下: 变量维度 Python变量 说明 一维 数字 int(有符号整型) 数字类型可以做转换 long(长整型[也可以代表八进制和十六进制]) float(浮点型) complex(复数) 字符串 字符串有丰富的运算符和内嵌函数: 有格式化输出: 二维 列表 除了元祖外,列表和字典可以灵活的扩展元素 元组 字典 2. Python变量的赋值处理 这里主要分析情况为,将原始变量赋值

Python变量基础知识

变量定义 标识符的第一个字符必须是字母或下划线: 标识符其余部分可以使字母.数字.下划线: 大小写敏感. 变量名应有意义,例如my_girl_name. 变量类型 整型:布尔型(True/False,常用于循环中的开关).整型(长度与内存相关,溢出会自动转为长整型).长整型: 非整型:双精度浮点型.复数.decimal(非内建类型): 序列类型:字符串(str).元组(tuple).列表(list): 映像类型:字典(dict): 集合类型:可变集合(set).不可变集合(frozenset).

python变量存储

变量的存储 在高级语言中,变量是对内存及其地址的抽象. 对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身. 引用语义:在python中,变量保存的是对象(值)的引用,我们称为引用语义.采用这种方式,变量所需的存储空间大小一致,因为变量只是保存了一个引用.也被称为对象语义和指针语义. 值语义:有些语言采用的不是这种方式,它们把变量的值直接保存在变量的存储区里,这种方式被我们称为值语义,例如C语言,采