import random
print random.choice(range(10))
和
from random import choice
print choice(range(10))
第一种方法:将模块的名字设置为一个隐含在名字空间里的全局变量,这样就好像访问全局属性那样访问choice函数;
第二种方法:直接把choice引入到全局名字空间里来(而非模块的名字),因此不再需要把这个属性当初模块的成员,实际上我们也只是拥有这个属性而已;
python中存在的误解:以为第二种方法只导入了个函数,而没有导入整个模块,这个不对的;整个模块已经被导入了,但是只有那个函数的引用被保存下来,所有;from-import
这种语法并不能带来性能上的差异,也没有节省内存一说;
很多人担忧的一个问题是有两个模块m.py 和n.py都导入了foo.py模块,当m导入n时,foo岂不是被导入了两次?简单的说,当python碰到一个已经加载的模块又被导入时,
它会跳过加载的过程,所以无需担心额外消耗内存的问题;
这个问题不能简单的使用是或者不是来回答,只能说看情况而定-----有的对象在传入函数时是传引用,而有些则是被复制进来,即传值;判断的依据就是看对象的可改变性
(mutability),而这一点取决于对象的类型;python程序员通常不用“传值”还是“传引用“这种说法,取而代之的是对象是可变的(mutable)还是不可变的(immutable)。
简单的类型或者“标量”类型,包括整数或其他数字类型,str 和 unicode这样的字符串类型,以及元组都是不可变的;
列表、字典、类、类实例等都是可变的;
实例:
1 >>> mylist = [1, ‘a‘ , [‘223‘, ‘bar‘] 2 ... ] 3 >>> mylist2 = list(mylist) 4 >>> mylist2[0] = 2 5 >>> mylist2[2][0] = ‘zzz‘ #修改列表的第一个元素 6 >>> print mylist 7 [1, ‘a‘, [‘zzz‘, ‘bar‘]] 8 >>> print mylist2 9 [2, ‘a‘, [‘zzz‘, ‘bar‘]] 10 >>>
总结:不可变对象(整数等)真正的被复制, 可变对象只是复制了一个对它们的引用,即在内存中只有一份对象,而有两份引用;
这就涉及到一个 ”深拷贝“ 的问题
原文:http://www.cnblogs.com/chris-cp/p/4684497.html