在python上修改全局变量传递参数函数

我以为我了解变量的全局范围与局部范围,但我正在努力解决一个问题。

这是我要实现的功能:

def login_table(id_name_verified,id_password):
    """
    :param id_name_verified: (DataFrame) DataFrame with columns: Id,Login,Verified.
    :param id_password: (numpy.array) Two-dimensional NumPy array where each element
                        is an array that contains: Id and Password
    :returns: (None) The function should modify id_name_verified DataFrame in-place.
              It should not return anything.
     goal : in id_name_verified,'Verified' column should be removed and password should be added from id_password with corresponding id and the column be named password
    """


Test:
import pandas as pd
import numpy as np


def login_table(id_name_verified,id_password):
    id_name_verified.drop(columns="Verified",inplace=True)
    password = pd.DataFrame(id_password)
    password.columns = ["Id","Password"]
    id_name_verified =id_name_verified.merge(password,on=['Id'])




id_name_verified = pd.DataFrame([[1,"JohnDoe",True],[2,"AnnFranklin",False]],columns=["Id","Login","Verified"])
id_password = np.array([[1,987340123],187031122]],np.int32)
login_table(id_name_verified,id_password)
print(id_name_verified)


预期输出:

   Id        Login   Password
0   1      JohnDoe  987340123
1   2  AnnFranklin  187031122

我得到的输出:

   Id        Login
0   1      JohnDoe
1   2  AnnFranklin

在pycharm上运行此命令时,我发现问题出在函数的最后一行,其中id_name_verified被标识为来自外部范围。 This inspection detects shadowing names defined in outer scopes.

如果我没有定义一个函数,它将起作用,所以我想我对传递给函数的参数的理解有些遗漏;有什么建议吗?

yiqwer 回答:在python上修改全局变量传递参数函数

以下是可以解决您问题的代码:

import pandas as pd
import numpy as np

def login_table( id_password):
    global id_name_verified
    id_name_verified.drop(columns="Verified",inplace=True)
    password = pd.DataFrame(id_password)
    password.columns = ["Id","Password"]
    id_name_verified =id_name_verified.merge(password,on=['Id'])

id_name_verified = pd.DataFrame([[1,"JohnDoe",True],[2,"AnnFranklin",False]],columns=["Id","Login","Verified"])
id_password = np.array([[1,987340123],187031122]],np.int32)
login_table( id_password)
print(id_name_verified)

我所做的更改是,我在函数“ login_table”中声明了“ id_name_verified”为全局变量。完成此操作后,您无需再次将“ id_name_verified”传递给该函数,因为通过使用关键字“ global”,我们已经将“ id_name_verified”的访问权授予了函数“ login_table”。因此删除了“ id_name_verified”作为函数的参数之一。

,

这是通过TestDome上所有4个测试的代码:

import pandas as pd
import numpy as np

def login_table(id_name_verified,id_password):
    """
    :param id_name_verified: (DataFrame) DataFrame with columns: Id,Login,Verified.   
    :param id_password: (numpy.array) Two-dimensional NumPy array where each element
                        is an array that contains: Id and Password
    :returns: (None) The function should modify id_name_verified DataFrame in-place. 
              It should not return anything.
    """   
    id_name_verified.drop(columns = 'Verified',inplace = True)
    password_df = pd.DataFrame(id_password)
    pass_col = password_df[1]
    id_name_verified['Password'] = pass_col

id_name_verified = pd.DataFrame([[1,np.int32)
login_table(id_name_verified,id_password)
print(id_name_verified)

您删除“已验证”列,然后仅在id_password之外创建一个新数据框,获取包含密码的列并将其添加到id_name_verified数据框。

,
import pandas as pd
import numpy as np 

def login_table(id_name_verified,id_password):
    # in place makes sure that changes are made in a current dataframe 
    id_name_verified.drop('Verified',1,inplace= True) 
    # id_password[:,1] -> : selects all rows and 1 selects only second column
    id_name_verified['Password'] = id_password[:,1]
    pass


id_name_verified = pd.DataFrame([[1,id_password)
print(id_name_verified)


,
import pandas as pd
import numpy as np

def login_table(id_name_verified,id_password):
    id_name_verified.drop(inplace=True,columns="Verified") # drop verified column inplace
    id_name_verified.insert(loc=2,column="Password",value=np.nan) # insert password column inplace
    for row in range(len(id_password)): 
        # apply the password on the rows that match using at
        id = id_password[row][0]
        pw = id_password[row][1]
        id_name_verified.at[row,"Password"] = pw

id_name_verified = pd.DataFrame([[1,id_password)
print(id_name_verified)
本文链接:https://www.f2er.com/3116129.html

大家都在问