python不允许程序员用传值和传引用,可以选择选用“传对象引用”的方式,这种方式等同于将传值和传引用综合起来,如果函数收到的是一个可变对象的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象,如果函数收到的是一个不可变对象的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象。
python引用主要有:不可变数据引用和可变数据引用,其中不可变数据引用包括:字符串String、浮点型Float、元祖Tuple。
1、字符串String
#1.字符串引用 a='1234' b=a a='hello' print('a:',a) #a:hello print('b:',b) #b:1234 #查看内存地址 print('a的内存地址是:',id(a)) print('a的内存地址是:',id(b)) 结果是: a: hellob: 1234a的内存地址是: 1651738050720a的内存地址是: 1651737219456 分析:b的值指向a的值。python开辟了新的内存空间给b,所以a和b的内存地址不一样。
2、浮点型Float
#2.浮点型引用 x=3.14 y=x x=9.88 print('x:',x) print('y:',y) print('x的内存地址是:',id(x)) print('y的内存地址是:',id(y)) 结果是: x: 9.88y: 3.14x的内存地址是: 2578075558248y的内存地址是: 2578075558008
3、元祖Tuple
元祖虽然是序列,且包含多个元素,但是不支持原处修改,如tuple[1]=1是非法的。#3.元祖引用 t1=(1,2,3,4,5) t2=t1 t1=('tuple','hello') print('t1:',t1) print('t2:',t2) print('t1的内存地址是:',id(t1)) print('t2的内存地址是:',id(t2)) 结果是: t修改后为: (1, 2, 3, ['x', 'a', 'D', 'b']) 可变数据引用包括:列表引用、字典引用、函数的传递引用
1、列表引用
#4 列表的可变引用 list1=[1,2,3,4,5] list2=list1 list1[3]='list' print('list1=====%s'%list1) print('list2=====%s'%list2) print('list1的内存地址是:',id(list1)) print('list2的内存地址是:',id(list2)) 结果是: list1=====[1, 2, 3, 'list', 5]list2=====[1, 2, 3, 'list', 5]list1的内存地址是: 2769992249864list2的内存地址是: 2769992249864
2、函数的传递引用
def eggs(someParameter): someParameter.append('hello list') spam=[1,2,3,4] eggs(spam) print(spam) 结果是: [1, 2, 3, 4, 'hello list']
3、字典引用 #5 字典的引用 a={'name':'Cathy','age':'27','job':'coder'} b=a a['age']='30' b['name']='Bob' print('a======%s'%a) print('b======%s'%b) print('a的内存地址是:', id(a)) print('b的内存地址是:', id(b)) 结果是: a======{'name': 'Bob', 'age': '30', 'job': 'coder'} b======{'name': 'Bob', 'age': '30', 'job': 'coder'} a的内存地址是: 2510825602792 b的内存地址是: 2510825602792
在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址。所以如果要在当前脚本引用其他文件,除了将文件放在和脚本同一目录下,还有以下几种方法,1. 将文件所在位置添加到sys.path中
import sys
sys.path.insert(0, '/path/to/application/app/folder') # or sys.path.append('/path/to/application/app/folder')
import file
2. 在文件目录下新建__init__.py文件然后调用文件
from application.app.folder.file import func_name
init.py文件
a).init.py文件的作用
该文件的主要作用使初始化Python包。如果目录下面包含了该文件,Python解释器就会将该目录当做一个包,下一步就可以使用import语句在别的.py脚本中引用该目录下的文件。一个标准Python模块的结构如下所示:
package/
__init__.py
file.py
file2.py
subpackage/
__init__.py
submodule1.py
submodule2.py
b). __init__文件可以为空但可以用来建立对包的需求。一般来说会在该文件中写那些类,函数等需要被导入到包水平,从而可以被方便的引用。比如:如果file.py文件中有一个File类,在init.py文件中啥都没写时引用File类需要这样操作:
from package.file import File
如果在__init__.py文件中将file导入包,那就在包水平可以直接引用File类:
# in your __init__.py
from file import File
# in your script
from package import File
此外,还需要注意的一点是__init__.py文件中的all变量。如果解释器在__init__.py文件中观察到了__all__变量,那么在运行from package import *时就只会引入__all__变量中列出的那些模块。例如:如果想在上述结构的只引入submodule1模块,那么可以在subpackage/__init__.py文件中定义__all__ = ['submodule1'],当引用subpackage时from subpackage import *就只引入了submodule1模块。
3. 将文件所在目录添加到python的环境变量
export PYTHONPATH=$HOME/pathToYourScripts/:$PYTHONPATH