Python 使函数更改主代码中的变量
我想创建一个函数,该函数执行以下操作:Python 使函数更改主代码中的变量,python,Python,我想创建一个函数,该函数执行以下操作: def func(*args): for arg in args: arg+=1 a = 5 b = 6 c = 7 func(a,b,c) print("%i,%i,%i"%(a,b,c)) 我希望它能返回: 6,7,8 我该怎么做?你不能!塔达 Python不支持任何形式的按引用传递。返回值: def func(*args): return [arg + 1 for arg in args] a = 5 b =
def func(*args):
for arg in args:
arg+=1
a = 5
b = 6
c = 7
func(a,b,c)
print("%i,%i,%i"%(a,b,c))
我希望它能返回:
6,7,8
我该怎么做?你不能!塔达
Python不支持任何形式的按引用传递。返回值:
def func(*args):
return [arg + 1 for arg in args]
a = 5
b = 6
c = 7
a, b, c = func(a, b, c)
print("%i,%i,%i" % (a, b, c))
def func(*args):
返回[arg+1表示args中的arg]
a=5
b=6
c=7
a,b,c=func(a,b,c)
打印(“%i,%i,%i”%(a,b,c))
你不能!塔达
Python不支持任何形式的按引用传递。返回值:
def func(*args):
return [arg + 1 for arg in args]
a = 5
b = 6
c = 7
a, b, c = func(a, b, c)
print("%i,%i,%i" % (a, b, c))
def func(*args):
返回[arg+1表示args中的arg]
a=5
b=6
c=7
a,b,c=func(a,b,c)
打印(“%i,%i,%i”%(a,b,c))
您不能,至少不能使用整数值。整数是不可变的,因此您无法更改其值,并且函数无权访问其调用方的命名空间,因此您无法重新绑定变量(即,在函数外部为变量a
分配新值)。请参阅和其他各种内容,了解可以做什么和不能做什么来影响函数中的变量
如果变量是列表等可变类型,则可以通过改变列表的值来实现类似效果:
def func(*args):
for arg in args:
arg[0] += 1
a = [5]
b = [6]
c = [7]
func(a,b,c)
print("%i,%i,%i"%(a,b,c))
但是,您应该思考为什么要这样做。最好是简单地返回值并在函数外部赋值。您不能,至少不能使用整数值。整数是不可变的,因此您无法更改其值,并且函数无权访问其调用方的命名空间,因此您无法重新绑定变量(即,在函数外部为变量
a
分配新值)。请参阅和其他各种内容,了解可以做什么和不能做什么来影响函数中的变量
如果变量是列表等可变类型,则可以通过改变列表的值来实现类似效果:
def func(*args):
for arg in args:
arg[0] += 1
a = [5]
b = [6]
c = [7]
func(a,b,c)
print("%i,%i,%i"%(a,b,c))
但是,您应该思考为什么要这样做。最好是简单地返回值并在函数外部赋值。您不能这样做,因为当您传入变量时,它会将其作为其值而不是变量 相反,
返回以下值:
def func(*args):
args = list(args)
for i in range(len(args)):
args[i]+=1
return args
a = 5
b = 6
c = 7
a, b, c = func(a,b,c)
print("%i,%i,%i"%(a,b,c))
哪些产出:
>>> print("%i,%i,%i"%(a,b,c))
6,7,8
>>>
你不能这样做,因为当你传入一个变量时,它会把它当作它的值,而不是它的变量
相反,返回以下值:
def func(*args):
args = list(args)
for i in range(len(args)):
args[i]+=1
return args
a = 5
b = 6
c = 7
a, b, c = func(a,b,c)
print("%i,%i,%i"%(a,b,c))
哪些产出:
>>> print("%i,%i,%i"%(a,b,c))
6,7,8
>>>
3个帖子告诉你“你不能”,但“不可能”。
Python是编程语言的通用语言。
所以有可能:
#!/usr/bin/env python
def func(args):
for i in range(len(args)):
args[i] += 1
abc = [5, 6, 7]
func(abc)
print("%i,%i,%i" % tuple(abc))
实际打印
6,7,8
3个帖子告诉你“你不能”,但“不可能”。
Python是编程语言的通用语言。
所以有可能:
#!/usr/bin/env python
def func(args):
for i in range(len(args)):
args[i] += 1
abc = [5, 6, 7]
func(abc)
print("%i,%i,%i" % tuple(abc))
实际打印
6,7,8
因为Python不通过引用传递不可变的对象,例如整数,所以您不容易做到这一点。但是,如果将当前作用域中对象的名称传递给函数,则可以实现如下目标:
import sys
def func(*args):
namespace = sys._getframe(1).f_globals # caller's globals
for arg in args:
namespace[arg] += 1
a = 5
b = 6
c = 7
func('a','b','c') # note variable *names* passed to function
print("%i,%i,%i" % (a,b,c)) # -> 6,7,8
因为Python不通过引用传递不可变的对象,例如整数,所以您不容易做到这一点。但是,如果将当前作用域中对象的名称传递给函数,则可以实现如下目标:
import sys
def func(*args):
namespace = sys._getframe(1).f_globals # caller's globals
for arg in args:
namespace[arg] += 1
a = 5
b = 6
c = 7
func('a','b','c') # note variable *names* passed to function
print("%i,%i,%i" % (a,b,c)) # -> 6,7,8
如果我像func(1,2,3)
那样调用它,你期望会发生什么?如果我像func(1,2,3)
那样调用它,你期望会发生什么?列表是通过引用传递的。@cdonts:不,列表是引用的。虽然从技术上讲Python不支持通过引用传递可能是正确的,但我认为这样说会产生误导,因为它会立即让人们问为什么它对列表的作用不同(StackOverflow上的许多其他问题都证明了这一点)。最好只说函数中可以(突变)和不能(调用作用域中的名称重新绑定)执行哪些操作。@BrenBarn:人们被误导了,认为通过引用传递和传递引用是一样的,我也想纠正这一点。@false:是的,但你不能通过说“Python不支持按引用传递”,但没有解释差异(或链接到其他问题).Lists是通过引用传递的。@cdonts:不,列表是引用。虽然从技术上讲Python不支持通过引用传递可能是正确的,但我认为这样说是误导性的,因为它会立即让人们问为什么它对列表的作用不同(StackOverflow上的许多其他问题都证明了这一点)。最好只说函数中可以(突变)和不能(调用作用域中的名称重新绑定)执行哪些操作。@BrenBarn:人们被误导了,认为通过引用传递和传递引用是一样的,我也想纠正这一点。@false:是的,但你不能通过说Python不支持在不解释差异(或链接到其他问题)的情况下“按引用传递”。但这与此不同。您不能将三个不同的变量作为[a、b、c]传递给它
。是的,但问题没有提到他需要传递三个不同的变量,所以我尝试了一下;)但这不是一回事。你不能传递三个不同的变量作为[a,b,c]
。是的,但问题没有提到他需要传递三个不同的变量,所以我尝试了一下;)Python传递int的方式与传递列表的方式完全相同:作为引用。但正如您所说,int是不可变的,因此无法修改引用的int。不管怎样,给定名称及其命名空间,都可以更改obje的内容名称所指的ct。Python传递int的方式与传递列表的方式完全相同:作为引用。但正如您所说,int是不可变的,因此无法修改引用的int。不管怎样,给定名称及其命名空间,都可以更改名称所指的对象。