Я хочу понять следующие результаты следующих методов, используемых в python3.X для выполнения определенных вещей. Рассмотрим следующий код, в котором с использованием разных методов пытается достичь того же результата.
def addSlash(fname):
if isinstance(fname, str):
if " " in fname:
return fname.replace(" ", "\ ")
# example output
a = "ab c"
a = addSlash(a)
print(a)
print()
# list of interest
files = ["spaces file1", "spaces file2", "spaces file3"]
for f in files:
f = addSlash(f)
# this prints correct result but list elements are not permanently having the change.
print(f)
print('\nThis did not change..')
print(files)
print('\nTrying the old way gives 2 slashes as well..')
files = ["spaces file1", "spaces file2", "spaces file3"]
for i in range(0, len(files)):
files[i] = addSlash(files[i])
print(files)
print('\nTrying this way give as different results, putting 2 slashes instead of one for some reason')
files = ["spaces file1", "spaces file2", "spaces file3"]
files = [addSlash(f) for f in files]
print(files)
print('\nSame with this one, same results as above.')
files = ["spaces file1", "spaces file2", "spaces file3"]
f = list(map(lambda x: x.replace(" ", "\ "), files))
print(f)
Результат вышеизложенного при работе следующий:
ab\ c
spaces\ file1
spaces\ file2
spaces\ file3
This did not change..
['spaces file1', 'spaces file2', 'spaces file3']
Trying the old way gives 2 slashes instead of one!
['spaces\\ file1', 'spaces\\ file2', 'spaces\\ file3']
Trying this way give as different results, putting 2 slashes as well!
['spaces\\ file1', 'spaces\\ file2', 'spaces\\ file3']
Same with this one, same results as above.
['spaces\\ file1', 'spaces\\ file2', 'spaces\\ file3']
Может ли кто-нибудь прокомментировать каждый метод и объяснить, почему он не работает?
Кроме того, if "" in fname: не имеет смысла ... все строки содержат пустую строку. Вы имели ввиду if " " in fname:? (Если эта строка странным образом разделилась, я понимаю, что вы хотели поставить пробел между кавычками.)
Да ты прав в этом, я имел в виду это
На самом деле, этот оператор if на самом деле вообще не нужен. Если в строке нет совпадений, str.replace() просто ничего не сделает.
Кстати, я не уверен, что полностью понял, будет ли отсутствовать двойная обратная косая черта, когда я использую ее для своего кода, или она будет там
На самом деле его там нет. Python просто добавляет туда лишнюю обратную косую черту, когда вы смотрите на значение объекта в интерпретаторе. Когда вы печатаете или передаете объект в программе, это будет правильно. (Подсказка: как вы думаете, что вернет len('\\')? Попробуйте.)





Двойные обратные косые черты - это всего лишь разница между печатью строки и просмотром представления строки Python. Последний будет избегать обратной косой черты с помощью другой обратной косой черты. Если вы используете
[print(f) for f in files], двойная обратная косая черта волшебным образом исчезнет.