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类的实例
python 变量引用的更多相关文章
- Python变量引用
>>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...
- Python 再谈变量作用域与变量引用
再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...
- Python中的变量引用对象需注意的几点
Python中的变量引用对象需注意的几点 分类:Python (55) (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...
- python变量、对象和引用你真的明白了吗
python变量.对象和引用你真的明白了吗 变量.对象和引用 Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是 ...
- Python 变量 对象 引用
1.变量 变量第一次赋值时被创建,变量在使用前必须赋值 变量本身没有类型,变量类型为它引用的对象类型: 变量在使用时被替换成它引用的对象 2.对象 对象本身具有计数和类型,变量引用对象,当对象的引用变 ...
- python 中变量引用问题
普通变量,如a=10,str="fdaf",它们在函数内的值是不会被带到函数外的,除非在函数内加上global,而引用是惰性原则,从最近的同名父级同名变量引用值 其它变量如列表,字 ...
- Python变量、数据类型6
1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...
- C与Python变量的区别
C中变量有类型,代表一定内存. 而Python变量只是封装过的指针,没有类型.如果不指向对象,就没有意义,更谈不上类型. python中 a=b,和C中 a=b是完全不同的两个操作.前者只是指针(引用 ...
- python——变量
参考资料: Python程序设计与实现 变量名的命名规则 仅仅由大.小写英文字母,下划线(_),数字(不可作为变量名的开头)组合而成: 不能使用Python关键字和函数名作为变量名: 变量名不能包含空 ...
随机推荐
- poj3050【dfs】
题意: 5*5的矩阵里,某个点能够上下左右走,走5步,然后路径会形成一个串,问你,这个5*5里面能够形成多少个不同个串. 思路: 直接暴搜,然后对于一个串塞到set里去,然后输出set里的个数就好了 ...
- BFS+PRIM
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299324104 在一个y行 x列的迷宫中,有可行走的通路空格' ',不可行走的墙'#', ...
- 收集一些Unity插件
MCS Male 系列,人形角色插件,表情+体型 Mecanim Control Mecanim Control is a coding tool made that allow for a wide ...
- Codeforces Round #402 (Div. 2) B
Description Polycarp is crazy about round numbers. He especially likes the numbers divisible by 10k. ...
- 复习Java和前端、后端框架等。
以下便是我开始复习时做的笔记.
- android动画(2)自定义动画
public class CustomAnimation extends Animation { // 这个方法可以获得动画view的width,height,以及它父view的width @Over ...
- hbuilder 中文乱码
这是因为HBuilder默认文件编码是UTF-8,你可以在工具-选项-常规-工作空间选项中设置默认字符编码
- 504 Base 7 七进制数
给定一个整数,将其转化为7进制,并以字符串形式输出.示例 1:输入: 100输出: "202" 示例 2:输入: -7输出: "-10"注意: 输入范围是 [- ...
- 167 Two Sum II - Input array is sorted 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数.函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2.请注意,返回的下标值(i ...
- Backbone.js入门教程第二版笔记(3)
视图渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...