Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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_Types - Fatal编程技术网

在不重新绑定的情况下更改python函数参数的类型

在不重新绑定的情况下更改python函数参数的类型,python,types,Python,Types,我知道python函数参数是通过引用传递的,可变参数可以修改函数中的范围外变量,除非重新绑定局部变量 我的问题是,我想将函数参数强制转换为其他类型,并影响传递的范围外变量。但我尝试的两种方法都只是重新绑定局部范围内参数 def change_type(my_var): try: if float(my_var) > 0: my_var = float(my_var) #just rebinds! except ValueError:

我知道python函数参数是通过引用传递的,可变参数可以修改函数中的范围外变量,除非重新绑定局部变量

我的问题是,我想将函数参数强制转换为其他类型,并影响传递的范围外变量。但我尝试的两种方法都只是重新绑定局部范围内参数

def change_type(my_var):
    try:
        if float(my_var) > 0:
            my_var = float(my_var) #just rebinds!
    except ValueError:
        pass


some_var = '0.5'
change_type(some_var)
print(type(some_var)) #gives 'str'; I want it to be 'float'
我还尝试了在
if
块中不赋值的情况下执行
float(my_var)
,但也没有任何效果

我有没有办法像这样修改范围外变量的数据类型,或者我必须直接在函数之外的
some\u var
上进行修改


谢谢

您可以在可变容器中传递,如下所示:

def change_type(my_var):
    try:
        if float(my_var[0]) > 0:
            my_var[0] = float(my_var[0])
    except ValueError:
        pass


some_var = ['0.5']
change_type(some_var)
print(type(some_var[0]))
有一种记录在案的方法可以影响局部变量在另一个框架中的绑定:模块。这可能适合您:

import inspect
def change_type(my_var):
    try:
        if float(my_var) > 0:
            my_var = float(my_var)
            inspect.stack()[1][0].f_locals['some_var'] = my_var
    except ValueError:
        pass


some_var = '0.5'
change_type(some_var)
print(type(some_var))

我希望很明显,以这种方式使用
inspect
是一个坏主意。

对于Python来说,将函数中修改过的参数作为元组返回是一种很好的方式。这更为冗长,还允许您实现您想要做的事情。与C或C++不同,可以使用内置类型<代码> tuple < /Cord>返回函数中的一个以上值,这样就不必通过引用来修改参数。 这就是诀窍(不包括
ValueError
):


是的,您可以在Python中更改浮点,但这是一个非常糟糕的主意,因为它们应该是不可变的

import sys, struct, ctypes

def set_float(obj, value):
    assert isinstance(obj, float), 'Object must be a float!'
    assert isinstance(value, float), 'Value must be a float!'
    stop = sys.getsizeof(obj)
    start = stop - struct.calcsize('d')
    array = ctypes.cast(id(obj), ctypes.POINTER(ctypes.c_ubyte))
    for args in zip(range(start, stop), struct.pack('d', value)):
        array.__setitem__(*args)
代码来自Python食谱中的配方。下面是如何使用
set\u float
功能的示例

>>> a = 1.2
>>> set_float(a, 3.4)
>>> a
3.4

请注意,此解决方案旨在与CPython配合使用,可能无法与其他版本的语言运行时配合使用。

您想实现什么?只需返回转换后的值。。。使用
some\u var=convert(some\u var)
。加分:如果愿意,您可以保留旧值。这是一种常见的方法,在多个地方用于检查变量的有效性(在这个简化示例中,>0)。我只是想在所有这些地方支持该变量的字符串和数字类型。如果检查通过,则需要对变量(回到这些位置)进行算术修改,因此需要转换为int或float。我的希望只是在check函数中执行,这样,如果检查通过,我就不必在所有其他地方编写
My_var=float(My_var)
。显然,我可以,我只是好奇地想知道是否有可能以某种方式在范围之外做到这一点。@Bakuriu,我意识到我当然可以归还它。这更像是一个学习问题。我只是想知道是否有可能修改超出范围的类型,仅此而已。我猜一位客人的回答是,最好的做法是完全按照你说的去做。这对我来说是个很好的回答。我确实想知道是否可以修改超出范围的类型,但将实现最佳实践方法。
'0.5'
是一个字符串。字符串在Python中是不可变的。不能修改不可变对象。相关:谢谢你的回答。正如我上面提到的,我确实想知道是否/如何能够在范围外修改类型(不返回值;我应该明确地说),所以这似乎是唯一的方法。最后,我会做A@客人说的话,因为这是最好的练习,但是谢谢你给我的好奇心。为了满足你的好奇心,考虑使用<代码>检查< /代码>。请参阅我最近的编辑。感谢您澄清最佳实践,很高兴知道这一点,这就是我将要做的。我接受了rob的回答,因为这个问题最初是想知道是否/如何修改超出范围的类型。实际上,我确实认为返回是一种选择,我的问题更多的是好奇。谢谢没问题,如果您不想深入研究python(与“如何将变量的值更改为超出范围”相关),您可以查看以下内容:。这使用了包装在模块
ctypes
中的Python底层实现(准确地说是CPython)。但是:小心处理!;-)@里弗·琼斯:根据标志改变类型看起来是个坏主意。为什么不能编写
value=float('0.5')
>>> a = 1.2
>>> set_float(a, 3.4)
>>> a
3.4