python函数名字可以是变量吗中函数与变量之间的位置怎么确定

订阅 你的位置: >
> 【整理】Python中变量的作用域(variable scope)
此文目的此文主要讨论和总结一下,Python中的变量的作用域(variable scope)。目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域;以避免,在写代码过程中,由于概念不清晰而导致用错变量,导致代码出错和变量含义错误等现象。如有错误,欢迎指正。&解释Python中变量的作用域Python变量作用域的解释之代码版所用的示例代码,主要来自于:中的:#!/usr/bin/python
# -*- coding: utf-8 -*-
-------------------------------------------------------------------------------
【整理】Python中:self和init__的含义 + 为何要有self和__init__
https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them
-------------------------------------------------------------------------------
#注:此处全局的变量名,写成name,只是为了演示而用
#实际上,好的编程风格,应该写成gName之类的名字,以表示该变量是Global的变量
name = "whole global name";
class Person:
name = "class global name"
def __init__(self, newPersionName):
#self.name = newPersionN
#此处,没有使用self.name
#而使得此处的name,实际上仍是局部变量name
#虽然此处赋值了,但是后面没有被利用到,属于被浪费了的局部变量name
name = newPersionN
def sayYourName(self):
#此处,之所以没有像之前一样出现:
#AttributeError: Person instance has no attribute 'name'
#那是因为,虽然当前的实例self中,没有在__init__中初始化对应的name变量,实例self中没有对应的name变量
#但是由于实例所对应的类Person,有对应的name变量,所以也是可以正常执行代码的
#对应的,此处的self.name,实际上是Person.name
print 'My name is %s'%(self.name); # -& class global name
print 'name within class Person is actually the global name: %s'%(name); #-& whole global name
print "only access Person's name via Person.name=%s"%(Person.name); # -& class global name
def selfAndInitDemo():
persionInstance = Person("crifan");
persionInstance.sayYourName();
print "whole global name is %s"%(name); # -& whole global name
###############################################################################
if __name__=="__main__":
selfAndInitDemo();&Python变量作用域的解释之图解版下面来图形来解释一下:&Python变量作用域的解释之文字版再用文字简要描述就是:全局变量(Global variable)不论是其他普通函数中,还是Class类中,都是可以通过对应的变量名,而可以直接引用的。局部变量(automatic variable)对于函数内,包括类Class的函数内,普通的变量,都是自动临时变量&此处插播背景知识:变量的优先级关系普通局部变量和全局变量的作用域,最核心的区别在于:内部变量的优先级大于外部变量此处即,(函数内的)局部变量,优先级大于,(外部的)全局变量换句话说:A。如果函数内部,出现了和全局变量同名的变量,则说明是局部变量;B。如果,函数内,没有同名的局部变量的情况下,对应的变量,则是全局变量。这个变量的优先级关系,不仅针对与Python语言,几乎其他所有语言,都适用,比如C/C++/C#等等。&所以,上面示例中的__init__中的name,不是全局变量:name = “whole global name”;中的name而是,局部变量;其中,此处是属于那种,Python(和,或其他特殊)语言所特有的,无需声明变量,就可以直接使用的情况。即局部变量name,并没有声明,但是就直接拿过来使用,通过:name = newPersionN在初始化,设置为对应的名字,此处即”crifan”了。&类(Class)的变量类的变量,在类的范围内,只能通过ClassName.PropertyName或者说ClassName.VariableName去访问,当前类ClassName的变量PropertyName例子中,就是通过Person.name去访问类Person中的变量name的值的。&示例(Instance)的变量示例中的变量,理论上,是用InstanceObject.PropertyName去访问的。而此处,由于Python中,默认的,约定俗成的写法,把类的函数的第一个参数的名字,定义为Instance变量,且名字叫做self,所以,就变成了:self.PropertyName了。所以,上述在类的函数中,想要访问Instance的变量的话,就是通过self.name,去访问类Person的示例self中的变量name了。&总结所以,想要彻底了解变量的作用域;还是要多多写代码自己测试。并且最好具有其他不同语言的相关背景知识,以便更加方便去实现横向对比,实现融会贯通,举一反三的效果。转载请注明: & 与本文相关的文章
17 queries in 0.363 seconds, using 10.51MB memorypython怎么访问函数里的变量_百度知道
python怎么访问函数里的变量
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
wodesitanfu
wodesitanfu
采纳数:852
获赞数:1089
闭包内部访问设为global没了
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 659622
博文数量: 120
博客积分: 887
博客等级: 准尉
技术积分: 1883
注册时间:
认证徽章:
RHCE,CCNA,熟悉shell脚本
分类: Python/Ruby 16:09:38
'''函数的工作原理:函数内部的变量都是临时的,
当你的函数返回以后,返回值可以被赋予一个变量。
这里是创建了一个新变量,用来存放函数的返回值。
def secret_formula(started):&& &&& &&& &&& &&& &&& &&& &# started 是函数中的形参
&&&&&&& jelly_beans = started * 500
&&&&&&& jars = jelly_beans / 1000
&&&&&&& crates = jars / 100
&&&&&&& return jelly_beans,jars,crates
start_point = 10000&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &# 赋值
''' start_point1是函数中的形参,beans,jars,crates为函数中新的变量,
个人理解:jelly_beans = beans,jars = jars,crates = crates,
start_point1 = 10000中的10000变为实参传入started,即上面def定义的函数中的start就等于10000 &
return 返回的值也就跟前面提到的jelly_beans = beans,jars = jars,crates = crates 一样了'''
beans,jars,crates = secret_formula(start_point)&& &&& &&& &&& &&& &
print "With a starting point of : %d" % start_point
print "We'd have %d beans, %d jars,and %d crates." % (beans,jars,crates)
为了便于解释与记忆,我将代码做了改变。。。
def secret_formula(10000):&& &&& &&& &# started 是函数中的形参
&& &&& &#jelly_beans = beans,jars = jars_new,crates = crates_new
&&&&&&& beans = 10000 * 500
&&&&&&& jars_new = beans / 1000
&&&&&&& crates_new = jars_new / 100
&&&&&&& return beans,jars_new,crates_new
start_point = 10000
beans,jars_new,crates_new = secret_formula(10000)&& &&& &# 函数中的started形参,在此处就等于&& &started = "start_point = 10000"&& &&& &
print "With a starting point of : %d" % 10000
print "We'd have %d beans, %d jars,and %d crates." % (beans,jars_new,crates_new)
start_point = start_point / 10
print "We can also do that this way:"
print "We'd have %d beans,%d jars,and %d crates." % secret_formula(start_point)
跟上面一样,我也将代码进行改动
没有了上面的 “beans,jars,crates = secret_formula(start_point)”声明,函数又回归到最初的变量赋值状态...
def secret_formula(started):&& &&& &&& &&& &&& &&& &&& &# started 是函数中的形参
&&&&&&& jelly_beans = started * 500
&&&&&&& jars = jelly_beans / 1000
&&&&&&& crates = jars / 100
&&&&&&& return jelly_beans,jars,crates
start_point = 10000&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &# 赋值
start_point = start_point / 10&& &&& &&& &&& &&& &&& &&& &# start_point = 10000 / 10 = 1000
print "We can also do that this way:"
print "We'd have %d beans,%d jars,and %d crates." % secret_formula(start_point)&& &&& &# 函数中的started形参,在此处就等于started = "start_point = start_point / 10"&& &
阅读(1251) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。1、定义函数的规则
我们自定义函数时,需要满足一些规则,否则编译器不会识别。
(1)函数代码块以def关键词开头,后接函数标识符名和圆括号()。
(2)任何传入实参和形参必须放在圆括号中。圆括号中写的是形参。
(3)函数的第一行语句可以选择性地使用文档字符串—-用于存放函数说明。
(4)函数内容以冒号起始,并且函数体要有缩进。
(5)return[expression]结束函数,选择性地返回一个值给调用者。不带表达式的return相当于返回None。
2、定义函数语法
def functionname( parameters ) :
"函数文档字符串(即函数说明)"
function_suite(函数体)
return [expression]
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
3、函数调用
函数被定义后,本身是不会自动执行的,只有在被调用后,才会被执行。
下面通过一个例子来讲解函数的调用。
def printStr(str1) :
"打印任何传入的字符串"
print str1
调用上面的打印字符串函数
原函数在定义时,定义了一个形参str1,所以在调用函数时,也必须传入一个参数,否则会报错。
printStr("调用字符串打印函数")
执行结果:
调用字符串打印函数
先来看两个例子。
实例1:传递变量
#!/usr/bin/python
#coding=utf-8
def changeNum(num) :
print "自定义函数中的num = ",num
#定义变量num,赋初始值为10
changeNum(num)
print "函数调用后num = ",num
执行结果:
自定义函数中的num =
函数调用后num =
实例2 :传序列list
#!/usr/bin/python
# -*- coding: utf-8 -*-
def changeList(list1) :
list1.append('newStr')
print "函数中的list :",list1
#定义变量num,赋初始值为10
list1 = [1,2,3]
print "调用函数前的list: ",list1
changeList(list1)
print "调用函数后的list:",list1
执行结果:
调用函数前的list:
函数中的list : [1, 2, 3, 'newStr']
调用函数后的list: [1, 2, 3, 'newStr']
从上面的结果可以看出,在函数中改变num变量的值,但是在函数调用之外num变量的值却没有改变。而在第二个实例中,在函数中像list1中增加一个元素’newStr’,在函数外查看原list1,发现也增加了一个元素’newStr’。也就是说在函数中改变list1,原list1也跟着改变。但是从这样我们就能说在Python中,实例1是传值,实例2是传引用吗?
其实非也,和其他语言不一样,在Python中,一切皆对象, Python参数传递采用的都是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象,此时如果想改变这些变量的值,可以将这些变量申明为全局变量。
5.return语句的语法格式:
return 语句表示退出函数,选择性地向调用方返回一个表达式或者是一个值或者由多个返回值组成的元组。不带参数值的return语句返回None。如果函数不需要返回值,也可以不用写return语句。
def printInfo(arg1, arg2) :
sum = arg1 + arg2
return sum
6.变量作用域
一个程序的所有变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分你可以访问哪个特定的变量名称。变量分为局部变量和全局变量。
7.局部变量
定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。这样的变量只在函数运行时存在,一旦退出函数,这些局部变量就都被销毁。所有在函数内部声明的变量名称都将被加入作用域中。如下实例:
def printInfo(arg1, arg2) :
sum = arg1 + arg2
print "函数中的sum = ",sum
#函数体外也定义了一个sum变量
printInfo(5,6)
print "函数外的sum = ",sum
上述程序执行结果:
函数中的sum = 11
函数外的sum = 1
8.全局变量
全局变量是在函数外定义的,可以在整个程序范围内访问,但是必须在所要访问的函数中使用关键词 global 声明函数外的变量为全局变量,这样访问的才是在函数外定义的全局变量。
def printInfo(y) :
sum = x + y
print "sum = ",sum
printInfo(5)
执行结果:
一旦变量被定义为全局变量后,在程序任何地方都可以访问,也可以修改。所以我们不建议过多的使用全局变量(非必要不使用),因为这样可能会导致全局变量的不可预知性,并且全局变量也降低了函数或模块之间的通用性,同时也降低了代码的可读性,别人有可能不知道这个调用的是哪的变量。
没有更多推荐了,全局变量和局部变量
我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效。
通过实例,我们可以进一步理解下,全局和局部的概念。
Python代码
count = 10
def print_local():
print(count)
def print_global():
print(count)
print_local()
print_global()
结果会是?
global语句
从上面课的代码中可以发现,如果在函数体内声明的变量名和已经有的全局变量名重复,那么局部变量就会把全局变量覆盖掉。如果想要在函数体内使用全局变量,使用前需要先用global语句来声明下用到的这个变量是全局变量。
Python代码
count = 10
def print_local():
global count
print(count)
def print_global():
print(count)
print_local()
print_global()
更多学习内容,就在码芽网http://www.mayacoder.com/lesson/index
这次的结果是:
Python3学习笔记4-函数,全局变量&局部变量,内置函数
python的局部变量和全局变量区别
python的 局部变量和全局变量
python 模块,类和全局函数---命名空间;继承和装饰器总结
python中函数使用全局变量方法:加global
python局部变量
python关于调用函数外的变量
python里面的全局变量和局部变量的区别(很好的一篇文章,找不到出处,原作者看到请联系,我会署上名字)
python中的局部变量和全局变量
Python 使用全局变量
没有更多推荐了,

我要回帖

更多关于 python函数调用局部变量 的文章

 

随机推荐