Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使函数更改主代码中的变量_Python - Fatal编程技术网

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。不管怎样,给定名称及其命名空间,都可以更改名称所指的对象。