【问题标题】:'str' object has no attribute 'len'“str”对象没有属性“len”
【发布时间】:2017-05-13 02:12:24
【问题描述】:

我有一种方法可以通过检查前三个字母/数字并确保它们相同,然后继续这样操作

def combineProcess(request):
    carID1 = request.POST['carID1']
    carID2 = request.POST['carID2']
    for x in range (0,3):
        a += carID1.length(x)
        b += carID2.length(x)
    if a.equals(b):
        //do something

在它使用之前它现在停止了,我得到了这个错误。

Exception Type: UnboundLocalError
Exception Value:    

local variable 'a' referenced before assignment

几周前我从未使用过它并没有改变任何东西,所以我将 a 和 b 设为全局。

def combineProcess(request):
    carID1 = request.POST['carID1']
    carID2 = request.POST['carID2']
    global a,b
    for x in range (0,3):
        a += carID1.length(x)
        b += carID2.length(x)
    if a.equals(b):
        //do something

现在我收到此错误。

Exception Type: NameError
Exception Value:    

name 'a' is not defined

然后我删除了全局线并放了这个

a = "P"

并得到以下错误

str object has no attribute length() or len()

这让我感到困惑,这段代码是如何停止工作的,为什么它不能识别出一个字符串对象有一个 len() 方法。主要是我迷失了我的代码是如何从工作到两周不工作的。

【问题讨论】:

  • 请修正缩进。我们不可能知道函数中有什么。使用 4 个空格得到一个代码块,另外 4 个空格显示函数的缩进。
  • 你确定你在这里写的是 Python,而不是 Java 之类的东西吗?除了 .length() 的问题之外,字符串在 Python 中也没有 .equals 方法。
  • 我认为这可能是问题所在,因为我每天都使用两种语言 python 和 c# 进行编码,所以我可能只是混淆了两者

标签: python django loops scope


【解决方案1】:

Python 字符串 len() 方法

语法

以下是 len() 方法的语法 -

len( str )

示例

str = "this is string example....wow!!!";
print("Length of the string: ", len(str))

当我们运行上面的程序时,它会产生以下结果 -

Length of the string:  32

参考Python String len() Method

UnboundLocalError: 在赋值之前引用了局部变量 'a'

说明

这是因为,即使存在 ab,您也在函数 combineProcess() 内部对名称 ab 使用赋值语句。自然地,这会在函数的作用域内创建一个名为ab 的变量。

Python 解释器在模块加载时看到这一点,并决定不应在本地范围内使用 ab 的全局范围,这会导致当您尝试在变量被引用之前引用它时出现问题本地分配。

示例

Var1 = 1
Var2 = 0
def function():
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Var1 =- 1

function()

如果你运行这个程序,它会给出以下错误。

UnboundLocalError: local variable 'Var1' referenced before assignment

由于Var1 的值被修改,这会在函数的作用域内创建一个名为Var1 的变量。结果因为条件检查报错,Var1 > 0Var1 =- 1语句之前。

但是如果我们修改代码如下。

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Var1 =- 1

function()

然后它就可以正常工作了。

注意,如果我们将Var1 =- 1语句移到if条件检查之前,那么即使不使用global Var1语句也不会报错。因此,以下代码可以正常工作。

Var1 = 1
Var2 = 0
def function():
    Var1 =- 1
    if Var2 == 0 and Var1 > 0:
        print("Result One")

function()

参考:请参阅此 SO answer

NameError: 名称“a”未定义

说明

您可能会收到此错误,因为在 Python 中,您无法使用 equals() 方法比较两个字符串。不存在这样的方法。

示例:比较两个字符串

您可以使用> , < , <= , <= , == , != 来比较两个字符串。 Python 按字典顺序比较字符串,即使用字符的 ASCII 值。例如,要比较两个字符串是否相等,您可以执行以下操作。

if string1 == string2:
    // do something

【讨论】:

    【解决方案2】:

    我假设您来自 Java 等语言,您可以直接在字符串上调用函数。您可以在 Python 中做到这一点:

    >>> A = "Hello"
    >>> B = "Hello"
    >>> A.__len__()
    5
    
    >>> A.__eq__(B)
    True
    

    但是,正确的做法是这样的:

    >>> len(A)
    5
    
    >>> A == B
    True
    

    话虽如此,我不确定你想用那里的长度函数来完成什么。您说您的代码正在检查 2 个字符串的前 3 个字母是否相同 - 您可以这样做:

    A = "car123"
    B = "car456"
    
    print(A[:3] == B[:3]) # -> True
    

    这使用 Python 的切片表示法来获取每个字符串的前 3 个字符,并将这些切片相互比较。

    【讨论】:

    • 感谢您的帮助,我不知道为什么,但我把这两个弄糊涂了(C# 和 python),只有当你们帮助时,它才变得清晰,但我仍然不明白为什么是代码像原来的方式一样工作......我很困惑为什么它会停止但谢谢我会做出必要的改变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2020-01-30
    • 2016-09-20
    • 2019-03-25
    • 2014-04-28
    • 2015-05-15
    • 2019-06-20
    相关资源
    最近更新 更多